package cn.cnf.service;

import cn.cnf.common.exception.CustomException;
import cn.cnf.common.utils.FileUtil;
import cn.cnf.config.StaticConfig;
import cn.cnf.entity.Pic;
import cn.cnf.entity.vo.FieldUploadResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.LinkedList;
import java.util.List;

/**
 * @author ZhuMeiYi
 * @date 2020/12/26 16:05
 * @description
 */
@Service
public class FileService {

    @Autowired
    private PicService picService;

    /**
     * 上传图片
     *
     * @param files    图片
     * @param folder   存放路径
     * @param markText 水印内容
     * @return 结果
     */
    public List<FieldUploadResult> multipleImageUpload(MultipartFile[] files, String folder, String markText) {

        // 要上传的目标文件存放的绝对路径
        if (StringUtils.isBlank(folder)) {
            throw new CustomException("绝对路径为空");
        }

        //一个文件上传的结果
        List<FieldUploadResult> results = new LinkedList<>();
        //循环保存文件
        for (MultipartFile file : files) {

            //上传结果信息
            FieldUploadResult result = new FieldUploadResult();

            //获取文件名
            String originalFilename = file.getOriginalFilename();

            if (file.getSize() / 1000 > 2000) {
                throw new CustomException("图片大小不能超过2000KB");
            } else {
                // 判断上传文件格式
                String fileType = file.getContentType();
                if ("image/jpeg".equals(fileType) || "image/png".equals(fileType) || "image/jpg".equals(fileType)) {

                    // 获取文件后缀名
                    String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
                    // 重新生成文件名 6位短id
                    String newFileName = (int) ((Math.random() * 9 + 1) * 100000) + suffixName;
                    // 生成真实路径
                    String realPath = StaticConfig.localPath + folder.replace("/", "\\");

                    if (FileUtil.upload(file, realPath, newFileName, markText)) {

                        // 文件存放的相对路径(一般存放在数据库用于img标签的src)
                        String relativePath = StaticConfig.relativePath + folder + "/" + newFileName;
                        // 前端根据是否存在该字段来判断上传是否成功
                        result.setRelativePath(relativePath);

                        // 保存到记录表
                        Pic pic = new Pic();
                        pic.setPath(relativePath);
                        pic.setRealPath(realPath);
                        // todo 状态用法待定
                        pic.setState(0);
                        picService.save(pic);

                    } else {
                        throw new CustomException("图片上传失败");
                    }
                } else {
                    throw new CustomException("图片格式不正确");
                }
            }
            result.setOriginalFilename(originalFilename);
            results.add(result);
        }
        return results;
    }
}
